package com.cyt.web.thrid.wechat;


import com.cyt.base.util.SpringApplicationContextUtil;
import com.cyt.wx.model.po.WxAccount;
import com.cyt.wx.model.vo.WxAccountVo;
import com.cyt.wx.service.WxAccountService;
import com.github.pagehelper.StringUtil;
import lombok.extern.slf4j.Slf4j;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 缓存工具类；
 * 目前使用 服务器内存的方式；
 *
 */
@Slf4j
public class WxMemoryCacheClient {
	private final static WxAccountService wxAccountService = (WxAccountService) SpringApplicationContextUtil.getBean("wxAccountService");
	/**
	 * 服务器内存的方式缓存wxAccountInfo
	 */
	private static Map<String,WxAccount> wxAccountInfoMap = new HashMap<String,WxAccount>();

	/**
	 * 设置应用信息内容
	 * @param wxAccount
	 * @param updateType 0,更新缓存，不更新到数据库，1、公众号token,2、jsToken
	 */
	public static void updateWxAccount(WxAccount wxAccount, int updateType){
		wxAccountInfoMap.put(wxAccount.getId(), wxAccount);
		if(updateType==1){
			WxAccount wxAccountResult=getWxAccount(wxAccount.getId());
			if(StringUtil.isNotEmpty(wxAccount.getAccessToken())){
				wxAccountResult.setAccessToken(wxAccount.getAccessToken());
				wxAccountResult.setAccessTokenEndTime(wxAccount.getAccessTokenEndTime());
			}
			wxAccountService.updateByPrimaryKey(wxAccount);
		}else if(updateType == 2){
			WxAccount wxAccountResult=getWxAccount(wxAccount.getId());
			if(StringUtil.isNotEmpty(wxAccount.getAccessToken())){
				wxAccountResult.setJsTicket(wxAccount.getJsTicket());
				wxAccountResult.setJsTicketEndTime(wxAccount.getJsTicketEndTime());
			}
			wxAccountService.updateByPrimaryKey(wxAccount);
		}
	}

	/**
	 * 获取应用
	 * @param applyId 应用id
	 * @return
	 */
	public static WxAccount getWxAccount(String applyId){
		WxAccount wxAccount = wxAccountInfoMap.get(applyId);
		if(wxAccount==null){
			acceptEntity();
		}
		return wxAccountInfoMap.get(applyId);
	}

	/**
	 * 清空缓存
	 */
	public static void deleteWxAccount(){
		wxAccountInfoMap.clear();
	}


	/**
	 * 获取应用，并将保存到缓存
	 */
	private static void acceptEntity(){
		deleteWxAccount();
		List<WxAccount> wxAccountList=wxAccountService.listExample(new WxAccountVo());
		if(wxAccountList!=null&&wxAccountList.size()>0){
			for(WxAccount wxAccount:wxAccountList){
				wxAccountInfoMap.put(wxAccount.getId(), wxAccount);
			}
		}
	}
}